package docindex

import (
	"fmt"
	"oa-rest/config"
	"os"
	"strings"

	"github.com/gin-gonic/gin"
	"oa-rest/common"
)

// UploadDocumentHandler 上传文档索引处理器
func UploadDocumentHandler(c *gin.Context) {
	var res common.Response

	// 获取JWT Token
	authToken := c.GetHeader("Authorization")
	if authToken == "" {
		// 尝试从Authorization头获取Bearer token
		authHeader := c.GetHeader("Authorization")
		if len(authHeader) > 7 && authHeader[:7] == "Bearer " {
			authToken = authHeader[7:]
		}
	}

	// 获取上传的文件
	file, err := c.FormFile("file")
	if err != nil {
		res.Format(c, "获取上传文件失败: "+err.Error())
		return
	}

	// 验证文件
	if file.Size == 0 {
		res.Format(c, "上传文件不能为空")
		return
	}

	// 检查文件类型（只允许文档类型）
	allowedExtensions := []string{".docx", ".doc", ".pdf", ".txt", ".md"}
	fileExt := getFileExtension(file.Filename)
	if !isAllowedExtension(fileExt, allowedExtensions) {
		res.Format(c, "不支持的文件类型，只允许: .docx, .doc, .pdf, .txt, .md")
		return
	}

	// 调用文档索引服务
	err = common.AIHttpClient.PostFile(config.AIUrl+":30006/upload_document", file)
	if err != nil {
		res.Format(c, fmt.Sprintf("调用文档索引服务失败: %v", err))
		return
	}

	res.Format(c)
}

// UploadDocumentJSONHandler JSON格式的上传文档索引处理器
func UploadDocumentJSONHandler(c *gin.Context) {
	var res common.Response
	var req UploadDocumentRequest

	// 绑定请求参数
	if err := c.ShouldBindJSON(&req); err != nil {
		res.Format(c, "参数解析失败: "+err.Error())
		return
	}

	// 参数验证
	if req.FilePath == "" {
		res.Format(c, "文件路径不能为空")
		return
	}

	// 检查文件是否存在
	if !fileExists(req.FilePath) {
		res.Format(c, "文件不存在: "+req.FilePath)
		return
	}

	// TODO: 这里可以实现从文件路径读取文件并索引的逻辑
	// 暂时返回功能未实现的错误
	res.Format(c, "JSON格式的文档索引功能暂未实现")
}

// getFileExtension 获取文件扩展名
func getFileExtension(filename string) string {
	for i := len(filename) - 1; i >= 0; i-- {
		if filename[i] == '.' {
			return filename[i:]
		}
	}
	return ""
}

// isAllowedExtension 检查扩展名是否在允许列表中
func isAllowedExtension(ext string, allowed []string) bool {
	ext = strings.ToLower(ext)
	for _, allowedExt := range allowed {
		if ext == allowedExt {
			return true
		}
	}
	return false
}

// fileExists 检查文件是否存在
func fileExists(filepath string) bool {
	_, err := os.Stat(filepath)
	return !os.IsNotExist(err)
}
